<?php
App::uses('AppModel', 'Model');
/**
 * Page Model
 *
 */
class Lbs extends AppModel {

	public $use = array();
 
	public function local($ip){
		$shop_city_id = $shop_id = $shop_building_id = 0;
		//$baidu = $this->bdapi($ip);
		if(true){//!$baidu['state']){
			$address = $this->qqip($ip);
		}
		if($address ==''){
			return false;
		}
		$p_per = '上海市';
		$p_index = '区';
		if(strrpos($address,$p_per)===false){ 	//没戏
			return false;
		}else{									//有戏
			$c_index_s = strpos($address,$p_index);
			if($c_index_s===false){
				return false;
			}else{
				$area = substr($address,9,$c_index_s-9);
			}
		
		}
		return array('city'=>'上海','area'=>$area);
	}
	
	//ip定位
	public function bdapi($ip = false){
		$ak = '2f8bbc267934f74a78a97c8c3a4ed856';
		$value = $this->curl_get_contents("http://api.map.baidu.com/location/ip?ak=$ak&ip=$ip",10);
		$value = json_decode($value,true);
		if($value && $value['status']==0){
			$state = true;
			$msg = 'paser success';
		}else{
			$state = false;
			$msg = 'paser error';
		}
		return array('state'=>$state,'msg'=>$msg,'data'=>$value);
	}
	
	//以下函数conrvertip()位于 Discuz!5_GBK/upload/include/misc.func.Php 路径中，有兴趣可以具体去阅读分析。
	//===================================
	//
	// 功能：IP地址获取真实地址函数
	// 参数：$ip - IP地址
	// 作者：[Discuz!] (C) Comsenz Inc.
	//
	//===================================
	//输出：纯真网络 2006年11月20日IP数据
	
	public function qqip($ip) {
	    //IP数据文件路径
	    $dat_path = APP.'/Vendor/qqwry/qqwry.dat';    //检查IP地址
	    if(!preg_match("/^\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}$/", $ip)){
	        return 'IP 地址错误！';
	    }
	    //打开IP数据文件
	    if(!$fd = @fopen($dat_path, 'rb')){
	        return 'IP数据文件无法读取，请确保是正确的IP库！';
	    }    //分解IP进行运算，得出整形数
	    $ip = explode('.', $ip);
	    $ipNum = $ip[0] * 16777216 + $ip[1] * 65536 + $ip[2] * 256 + $ip[3];    //获取IP数据索引开始和结束位置
	    $DataBegin = fread($fd, 4);
	    $DataEnd = fread($fd, 4);
	    $ipbegin = implode('', unpack('L', $DataBegin)); //unpack() 函数从二进制字符串对数据进行解包。unpack(format,data) L - unsigned long (always 32 bit, machine byte order) 
		#$ipbegin 值如：5386001
		if($ipbegin < 0) $ipbegin += pow(2, 32);
		    $ipend = implode('', unpack('L', $DataEnd));
		    if($ipend < 0) $ipend += pow(2, 32);
		    $ipAllNum = ($ipend - $ipbegin) / 7 + 1;
		    
		    $BeginNum = 0;
		    $EndNum = $ipAllNum;    //使用二分查找法从索引记录中搜索匹配的IP记录
			$ip1num=''; $ip2num='';   $ipAddr1='';    $ipAddr2='';
	   		while($ip1num>$ipNum || $ip2num<$ipNum) {
	        $Middle= intval(($EndNum + $BeginNum) / 2);        //偏移指针到索引位置读取4个字节
	        fseek($fd, $ipbegin + 7 * $Middle);
	        $ipData1 = fread($fd, 4);
	        if(strlen($ipData1) < 4) {
	            fclose($fd);
	            return 'System Error';
	        }
	        //提取出来的数据转换成长整形，如果数据是负数则加上2的32次幂
	        $ip1num = implode('', unpack('L', $ipData1));
	        if($ip1num < 0) $ip1num += pow(2, 32);
	        
	        //提取的长整型数大于我们IP地址则修改结束位置进行下一次循环
	        if($ip1num > $ipNum) {
	            $EndNum = $Middle;
	            continue;
	        }
	        
	        //取完上一个索引后取下一个索引
	        $DataSeek = fread($fd, 3);
	        if(strlen($DataSeek) < 3) {
	            fclose($fd);
	            return 'System Error';
	        }
	        $DataSeek = implode('', unpack('L', $DataSeek.chr(0)));
	        fseek($fd, $DataSeek);
	        $ipData2 = fread($fd, 4);
	        if(strlen($ipData2) < 4) {
	            fclose($fd);
	            return 'System Error';
	        }
	        $ip2num = implode('', unpack('L', $ipData2));
	        if($ip2num < 0) $ip2num += pow(2, 32);        //没找到提示未知
	        if($ip2num < $ipNum) {
	            if($Middle == $BeginNum) {
	                fclose($fd);
	                return 'Unknown';
	            }
	            $BeginNum = $Middle;
	        }
	    }    //下面的代码读晕了，没读明白，有兴趣的慢慢读
	    $ipFlag = fread($fd, 1);
	    if($ipFlag == chr(1)) {
	        $ipSeek = fread($fd, 3);
	        if(strlen($ipSeek) < 3) {
	            fclose($fd);
	            return 'System Error';
	        }
	        $ipSeek = implode('', unpack('L', $ipSeek.chr(0)));
	        fseek($fd, $ipSeek);
	        $ipFlag = fread($fd, 1);
	    }    if($ipFlag == chr(2)) {
	        $AddrSeek = fread($fd, 3);
	        if(strlen($AddrSeek) < 3) {
	            fclose($fd);
	            return 'System Error';
	        }
	        $ipFlag = fread($fd, 1);
	        if($ipFlag == chr(2)) {
	            $AddrSeek2 = fread($fd, 3);
	            if(strlen($AddrSeek2) < 3) {
	                fclose($fd);
	                return 'System Error';
	            }
	            $AddrSeek2 = implode('', unpack('L', $AddrSeek2.chr(0)));
	            fseek($fd, $AddrSeek2);
	        } else {
	            fseek($fd, -1, SEEK_CUR);
	        }        while(($char = fread($fd, 1)) != chr(0))
	            $ipAddr2 .= $char;        $AddrSeek = implode('', unpack('L', $AddrSeek.chr(0)));
	        fseek($fd, $AddrSeek);        while(($char = fread($fd, 1)) != chr(0))
	            $ipAddr1 .= $char;
	    } else {
	        fseek($fd, -1, SEEK_CUR);
	        while(($char = fread($fd, 1)) != chr(0))
	            $ipAddr1 .= $char;        $ipFlag = fread($fd, 1);
	        if($ipFlag == chr(2)) {
	            $AddrSeek2 = fread($fd, 3);
	            if(strlen($AddrSeek2) < 3) {
	                fclose($fd);
	                return 'System Error';
	            }
	            $AddrSeek2 = implode('', unpack('L', $AddrSeek2.chr(0)));
	            fseek($fd, $AddrSeek2);
	        } else {
	            fseek($fd, -1, SEEK_CUR);
	        }
	        while(($char = fread($fd, 1)) != chr(0)){
	            $ipAddr2 .= $char;
	        }
	    }
	    fclose($fd);    //最后做相应的替换操作后返回结果
	    if(preg_match('/http/i', $ipAddr2)) {
	        $ipAddr2 = '';
	    }
	    //iconv("GBK","UTF-8//IGNORE",$ipAddr1) ;
	    $ipaddr = "$ipAddr1 $ipAddr2";
	    $ipaddr = preg_replace('/CZ88.Net/is', '', $ipaddr);
	    $ipaddr = preg_replace('/^s*/is', '', $ipaddr);
	    $ipaddr = preg_replace('/s*$/is', '', $ipaddr);
	    if(preg_match('/http/i', $ipaddr) || $ipaddr == '') {
	        $ipaddr = 'Unknown';
	    }   

	    $address = iconv("GBK","UTF-8//IGNORE",$ipaddr) ;
	    $address = split(' ',$address);
	    return $address[0];
	}
		
	/**
	 * 
	 * @author zmx@gootop.net  
	 * @Date 2011-11-11
	 * @return 
	 */
	private function curl_get_contents($url, $second = 5,$post = false) {         
        $ch = curl_init();  
        //如果有post值 则传递       
        $content =false;
        if($post){
		    $options = array(CURLOPT_POSTFIELDS => $post);
		    curl_setopt_array($ch, $options); 
        }
        curl_setopt($ch,CURLOPT_URL,$url);         
        curl_setopt($ch,CURLOPT_HEADER,0);     
        //curl_setopt($ch,CURLOPT_FAILONERROR, 1);              // Fail on errors
		curl_setopt($ch,CURLOPT_FOLLOWLOCATION, 1);        
        curl_setopt($ch,CURLOPT_TIMEOUT,$second);         
        curl_setopt($ch,CURLOPT_RETURNTRANSFER, true);         
        $content = curl_exec($ch);  
        $this->url = curl_getinfo($ch,CURLINFO_EFFECTIVE_URL);
        curl_close($ch);         
        return $content;         
	}	
}
